/**
**********************************************************************************************************************************************************************************************************************************
* @file:	List.h
* @author:	zinface
* @date:	2021年09月25日 20:45:20 星期六
* @brief:	FinalC 提供的 List 数据集类型操作集
*
* 1. createList(): 创建空的 List 对象实例
* 2. createListWith_data(fpointer): 创建 List
*
* destroyList: 释放 List 对象
*
**********************************************************************************************************************************************************************************************************************************
**/


#include "FinalCType/List.h"

// FinalC_Object_Define(List) {
//     void *data;
//     List *next;
//     // List *prev;
// };
FinalC_Object_Size(List);
#define self list->data
#define child list->next
#define parent list->prev

// #define FinalC_List_Func_Define(func) FinalC_Object_Func_Prefix(func, list)

// ------------------------------------ Constructor
/**
 * createList(): 创建空的 List 对象实例
 *
 */
FINALC_WARN_UNUSED_RESULT
FinalC_Object_Create_Define(List) {
    List *list = (List*)calloc(ListSize(), 1);
    self = NULL;
    child = NULL;
    parent = NULL;
    return list;
}

/**
 * createListWith_data(): 创建空的 List 对象实例
 *
 */
FINALC_WARN_UNUSED_RESULT
List *createListWith_data(fpointer data)  {
  List *list = createList();
  self = data;
  return list;
}

// ------------------------------------ Destructor
/**
 * destroyList: 释放 List 对象
 *
 * NOTE: 该对象结构指向的元素(如有)将不会进行释放，否则使用 deleteList()
 */
FinalC_Object_Destroy_Define(List) {
    if (v && v->next) destroyList(v->next);
    if (v && v->next) v->next = NULL;
    
    if (v && v->data) v->data = NULL;
    
    if (v) free(v);
    if (v) v = NULL;
}

/**
 * deleteList: 销毁 List 对象
 * 
 * NOTE: 该对象指向的内存(如有)将会进行释放
 */
// FinalC_Object_Delete_Define(List) {
//     if (v && v->next) deleteList(v->next);
//     if (v && v->next) v->next = NULL;

//     if (v && v->data) free(v->data);
//     if (v && v->data) v->data = NULL;
    
//     if (v) free(v);
//     if (v) v = NULL;
// }

void deleteListWithFunc(List *list, FinalCDeleteFunc deleteFunc) {
    finalc_list_foreach(list, (FinalCFunc)deleteFunc, NULL);
    destroyList(list);
}

// ------------------------------------ Exstenstion Func: foreach
void finalc_list_foreach(List *list, FinalCFunc func, void *data) {
    for (List *iter = list; iter; iter=iter->next) {
        if (func) func(iter->data, data);
    }
}
// ------------------------------------ Exstenstion Func: Append
FINALC_WARN_UNUSED_RESULT
List *FinalC_List_Func_Define(Prepend)(List *list, fpointer data) {
    if (!list) list = createListWith_data(data);
    else {
        parent = createListWith_data(data);
        parent->next = list;
        return parent;
    }
    return list;
}

FINALC_WARN_UNUSED_RESULT
List *FinalC_List_Func_Define(Append)(List *list, fpointer data) {
    if (!list) list = createListWith_data(data);
    else {
        List *iter = list;
        for (; iter && iter->next; iter = iter->next) {}
        iter->next = createListWith_data(data);
    }
    return list;
}

// ------------------------------------ Exstenstion Func: Length
int FinalC_List_Func_Define(Length)(List *list) {
    int length = 0;
    for (List *iter = list; iter; iter = iter->next) {
        length ++;
    }
    return length;
}

// ------------------------------------ Exstenstion Func: Index
List *FinalC_List_Func_Define(Index)(List *list, int index) {
    int i = 0;
    for (List *iter = list; iter; iter=iter->next) {
        if (i++ == index) return iter;
    }
    return NULL;
}
